home *** CD-ROM | disk | FTP | other *** search
/ Aminet 52 / Aminet 52 (2002)(GTI - Schatztruhe)[!][Dec 2002].iso / Aminet / game / board / RXDraughts.lha / RXDraughts.rexx < prev   
OS/2 REXX Batch file  |  2002-10-13  |  16KB  |  639 lines

  1. /* RXDraughts 2.0 ©2002 Michael Trebilcock
  2.  
  3.    Changes since 1.9:
  4.  
  5.    GUI is not complete.
  6.  
  7.    - Optimizations.
  8.    - Moved code to a FMove() function.
  9.    - Forced jumping (not completed). (Huffing not)
  10.    - "Game over" code finished.
  11.  
  12.    To do:
  13.    - Add huffing support (Soon)
  14.    - Pieces jumped flash for half a second. (Maybe)
  15.    - Last valid move can be shown visibly. (Maybe)
  16.    - Chat option for online multiplayer. (Doubt it)
  17.  
  18.    Known bugs:
  19.    - None
  20.  
  21. */
  22.  
  23. /* Configuration */
  24. Huff   = "0"  /* 0 = Forced jumping, 1 = Huffing enabled */
  25. Delay  = "0"  /* Slow down the computer (50 = 1 sec) */
  26. /* End Configuration */
  27.  
  28. Signal On Halt
  29. Signal On Break_C
  30.  
  31. Call AddLib("rexxtricks.library","0","-30","0")
  32. Call AddLib("rexxdossupport.library","0","-30","0")
  33. Call AddLib("rexxsupport.library","0","-30","0")
  34. Call AddLib("rexxreqtools.library","0","-30","0")
  35.  
  36. Play="B"
  37.  
  38. DO i=1 TO 8
  39.  Let=d2c(64+i)
  40.  Let.Let=i
  41.  Let.i=Let
  42. End
  43.  
  44. DO i=1 TO 32
  45.  P.i=""
  46. End
  47.  
  48. DO i=1 TO 12
  49.  P.i="w"
  50. End
  51.  
  52. DO i=21 TO 32
  53.  P.i="b"
  54. End
  55.  
  56. PosX="b";PosX.PosX="1"
  57. PosX="B";PosX.PosX="31"
  58. PosX="w";PosX.PosX="61"
  59. PosX="W";PosX.PosX="91"
  60. PosX="";PosX.PosX="121"
  61.  
  62. Move2="<none>"
  63. CJump="0"
  64.  
  65. Call NewGame()
  66.  
  67. Text="Human VS Human"
  68. IF Opt="2" THEN Text="Human VS Computer"
  69. IF Opt="3" THEN Text="Computer VS Computer"
  70. IF Opt="4" THEN Text="Human VS Human (TCP/IP)"
  71.  
  72. IF TFile~="" THEN DO
  73.  IF ~Open(File,TFile,"R") THEN DO
  74.   SAY "Unable to open "TFile
  75.   Exit
  76.  End
  77.  DO i=1 TO 32
  78.   P.i=ReadLn(File)
  79.  End
  80.  Call Close(File)
  81.  Play=Upper(Play)
  82. End
  83.  
  84. IF Opt="4" THEN DO
  85.  IF Plr="1" THEN DO
  86.   SAY "Attemping to connect to "IP" on port 998..."
  87.   DO UNTIL Open(TCP,"TCP:"IP"/998","R")
  88.    Call Delay(50)
  89.   End
  90.   SAY "Connected, sending info.."
  91.   DO i=1 TO 32
  92.    Call WriteLn(TCP,P.i)
  93.   End
  94.   Call WriteLn(TCP,Play)
  95.   Call Close(TCP)
  96.   SAY "Sent, starting game."
  97.  End
  98.  ELSE DO
  99.   SAY "Waiting for player one..."
  100.   Call Delete("T:Board.tmp")
  101.   ADDRESS COMMAND "Run >NIL: Copy TCP:998 T:Board.tmp"
  102.   DO UNTIL Open(File,"T:Board.tmp","R")
  103.    Call Delay(50)
  104.   End
  105.   SAY "Player one connected, receiving info.."
  106.   DO i=1 TO 32
  107.    P.i=ReadLn(File)
  108.   End
  109.   Play=ReadLn(File)
  110.   Call Close(File)
  111.   SAY "Info received, starting game."
  112.  End
  113.  Opt="1"
  114. End
  115.  
  116. Call GUI()
  117.  
  118. DO UNTIL End="1"
  119.  Error="0";Jump="0"
  120.  King="0";HJump="0"
  121.  SAY ""
  122.  IF Play="B" THEN SAY "Black players turn: "
  123.  ELSE SAY "White players turn: "
  124.  SAY "(I.E: A2 B1 to move from A2 to B1)"
  125.  SAY "(I.E: F1 D3 B5 etc.. for double/triple jumps)"
  126.  SAY "Last valid move: "Move2
  127.  IF Opt="2"&Play="W"|Opt="3" THEN DO
  128.   Call FMove()
  129.   IF Jump="1"&ValidJps~="" THEN DO
  130.    SAY "Jump(s) found."
  131.    SAY "Jumps can be made from squares "ValidJps
  132.    SAY "Selecting a random jump.."
  133.    Words=Words(ValidJps)
  134.    Num3=Word(ValidJps,Rand(1,Words))
  135.    SAY "Piece selected is "Num3
  136.    SAY "Jumps are "TJP.Num3
  137.    SAY "Selecting random square to jump over"
  138.    Words=Words(TJP.Num3)
  139.    Num4=Word(TJP.Num3,Rand(1,Words))
  140.    Parse Var Num4 TheSq"/"GNum2"/"Num4
  141.    SAY "Square to jump over is "GNum2
  142.    P.GNum2=""
  143.   End
  144.   ELSE IF CJump~="1"&ValidSqs~="" THEN DO
  145.    SAY "Randomly selecting a moveable piece.."
  146.    Words=Words(ValidSqs)
  147.    Num3=Word(ValidSqs,Rand(1,Words))
  148.    SAY "Piece selected is "Num3
  149.    SAY "Squares to move to are "TP.Num3
  150.    SAY "Selecting random square to move to"
  151.    Words=Words(TP.Num3)
  152.    Num4=Word(TP.Num3,Rand(1,Words))
  153.    SAY "Square to move to is "Num4
  154.   End
  155.   Let4=0
  156.   IF Play="W"&Num4>28&Num4<33 THEN Let4=8
  157.   IF Play="B"&Num4>0&Num4<5 THEN Let4=1
  158.   IF CJump="1"&Jump="0" THEN DO
  159.    SAY "Cannot make another jump with the same piece"
  160.    CJump="0";Error="1"
  161.    IF Play="B" THEN Play="W"
  162.    ELSE Play="B"
  163.   End
  164.  End
  165.  ELSE IF End~="1" THEN DO
  166.   IF CJump~="2" THEN DO
  167.    IF Plr="1"&Play="W"|Plr="2"&Play="B" THEN DO
  168.     SAY "Waiting for opponent to make a move.."
  169.     ADDRESS COMMAND "Copy TCP:998 T:RXDMove.tmp"
  170.     Call Open(File,"T:RXDMove.tmp","R")
  171.     Move=ReadLn(File)
  172.     Call Close(File)
  173.    End
  174.    ELSE DO
  175.     Call FMove()
  176.     IF End~="1" THEN Call GMove(1)
  177.    End
  178.   End
  179.   Move=Upper(Move)
  180.   IF Move="EOF" THEN Call Break_C()
  181.   IF W2=SG THEN DO
  182.    TFile=rtgetstring("","Enter filename:","RXDraughts","Save")
  183.    IF ~Open(File,TFile,"W") THEN DO
  184.     SAY "Unable to open "TFile
  185.    End
  186.    ELSE DO
  187.     DO i=1 TO 32
  188.      Call WriteLn(File,P.i)
  189.     End
  190.     Call Close(File)
  191.     SAY "Game saved.."
  192.     Error="1"
  193.    End
  194.   End
  195.   Let=Left(Move,1);Num=SubStr(Move,2,1)
  196.   Let2=SubStr(Move,4,1);Num2=SubStr(Move,5,1)
  197.   Let3=Let.Let;Let4=Let.Let2
  198.  End
  199.  IF End="1" THEN Error="1"
  200.  IF Error="0"&Play="B"&Opt<3|Error="0"&Opt="1" THEN DO
  201.   Call Grid(Let3""Num);Num3=GNum2
  202.   Call Grid(Let4""Num2);Num4=GNum2
  203.   IF Upper(P.Num3)=P.Num3 THEN King="1"
  204.   Squares=Compress(Translate(Num-Num2,"","-"))
  205.   Lets=Compress(Translate(Let3-Let4,"","-"))
  206.   SELECT
  207.    WHEN Play="B"&Upper(P.Num3)="W"|Play="W"&Upper(P.Num3)="B" THEN DO
  208.     SAY "You cannot move the other players piece."
  209.     Error="1"
  210.    End
  211.    WHEN P.Num3="" THEN DO
  212.     SAY "Invalid move. You cannot move a blank square."
  213.     Error="1"
  214.    End
  215.    WHEN Play="B"&Let4-Let3>0&King="0"|Play="W"&Let3-Let4>0&King="0" THEN DO
  216.     SAY "Invalid move. Only kings can move backwards."
  217.     Error="1"
  218.    End
  219.    WHEN Squares>1|Lets>1|Num=Num2|Let=Let2 THEN DO
  220.     IF Play="B" THEN DO
  221.      IF Num2=Num-2|Num2=Num+2 THEN IF Let4=Let3-2|Let4=Let3+2 THEN HJump="1"
  222.      IF Let4=Let3+2&King="0" THEN Error="1"
  223.     End
  224.     IF Play="W" THEN DO
  225.      IF Num2=Num-2|Num2=Num+2 THEN IF Let4=Let3+2|Let4=Let3-2 THEN HJump="1"
  226.      IF Let4=Let3-2&King="0" THEN Error="1"
  227.     End
  228.     IF HJump="0" THEN DO
  229.      IF Error="1" THEN SAY "Invalid move. Only kings can jump backwards."
  230.      ELSE SAY "Invalid move. You may only move diagnally one square unless jumping."
  231.      Error="1"
  232.     End
  233.     ELSE DO
  234.      Call Vacant()
  235.      IF Error="0" THEN DO
  236.       IF Let4-Let3>0 THEN Let5=Let3+1
  237.       ELSE Let5=Let3-1
  238.       IF Num2=Num-2 THEN Call Grid(Let5""Num-1)
  239.       IF Num2=Num+2 THEN Call Grid(Let5""Num+1)
  240.       IF Play="W"&Upper(P.GNum2)="W"|Play="B"&Upper(P.GNum2)="B" THEN DO
  241.        SAY "You cannot jump over your own piece."
  242.        Error="1"
  243.       End
  244.       IF P.GNum2="" THEN DO
  245.        SAY "You cannot jump over a blank square."
  246.        Error="1"
  247.       End
  248.       GNum3=P.GNum2
  249.       IF Error="0" THEN P.GNum2=""
  250.      End
  251.     End
  252.    End
  253.    OTHERWISE Call Vacant()
  254.   End
  255.  End
  256.  IF Opt="1"|Opt="4"|Opt="2"&Play="B" THEN Jump=HJump
  257.  IF Jump="0"&ValidJps~=""&Huff="0" THEN DO
  258.   IF Error="0" THEN Call ToPipe('ID 'MG' gt="You must jump!"')
  259.   Error="1"
  260.  End
  261.  IF Error="0" THEN DO
  262.   CJump2=CJump
  263.   IF CJump="2" THEN CJump="0"
  264.   IF Jump="1" THEN DO
  265.    SAY "Jumping over piece "GNum2". Moving from "Num3" to "Num4
  266.    IF Opt="2"&Play="W"|Opt="3" THEN CJump="1"
  267.    IF Play="B"&Opt<3|Play="W"&Opt="1" THEN DO
  268.     Parse Var Move M1" "Move
  269.     IF Words(Move)>1 THEN CJump="2"
  270.    End
  271.    IF Play="B"&Let4=1&King="0"|Play="W"&Let4=8&King="0" THEN CJump="0"
  272.   End
  273.   ELSE SAY "Moving piece "Num3" to "Num4
  274.   Call Grid2(Num3);Let=Word(Let,1);GLet=Let.Let""Num
  275.   Call Grid2(Num4);Let=Word(Let,1);GLet2=Let.Let""Num
  276.   Move2=GLet GLet2
  277.   IF Plr="1"&Play="B"|Plr="2"&Play="W" THEN IF CJump2="0" THEN DO
  278.    i=0;Sent="0"
  279.    IF CJump="2" THEN TMove=M1 Move
  280.    ELSE TMove=Move2
  281.    DO UNTIL i="5"|Sent="1"
  282.     IF ~Open(TCP,"TCP:"IP"/998","W") THEN Call Delay(50)
  283.     ELSE DO;Call WriteLn(TCP,TMove);Sent="1";End
  284.     i=i+1
  285.    End
  286.    Call Close(TCP)
  287.    SAY i
  288.    IF Sent="0" THEN DO
  289.     SAY "Unable to send move.."
  290.     Call Break_C()
  291.    End
  292.   End
  293.   Piece=P.Num3;P.Num3=""
  294.   IF Play="B" THEN P.Num4=Piece
  295.   IF Play="B"&Let4=1 THEN P.Num4="B"
  296.   IF Play="W" THEN P.Num4=Piece
  297.   IF Play="W"&Let4=8 THEN P.Num4="W"
  298.   IF CJump~="1"&CJump~="2" THEN DO
  299.    IF Play="B" THEN Play="W"
  300.    ELSE Play="B"
  301.   End
  302.   Call GMove()
  303.   IF Opt="3" THEN Call Delay(Delay)
  304.  End
  305.  ELSE IF CJump="2" THEN DO
  306.   SAY "Invalid multiple jump.."
  307.   CJump="0";Error="1"
  308.   IF Play="B" THEN Play="W"
  309.   ELSE Play="B"
  310.  End
  311. End
  312.  
  313. IF Play="W" THEN SAY "Game over. Black wins!"
  314. ELSE SAY "Game over. White wins!"
  315. Call rtezrequest("Game over!")
  316. Exit
  317.  
  318. GUI:
  319. Dis="";Num=1
  320. XY="|1|29|29|0|0|0"
  321. TPipe="PIPE"
  322.  
  323. IF ~Open(PIPE,"AWNPipe:RXDraughts/xc","RW") THEN DO
  324.  SAY "Unable to open GUI, please install AWNPipe:"
  325.  Exit
  326. End
  327.  
  328. Call ToPipe('title "RXDraughts ©2002 Michael Trebilcock" v fw fh m defg')
  329. Call ToPipe('layout v b=5 cj weih=0')
  330. Call ToPipe(' label gt="Welcome to RXDraughts 2.0"')
  331. Call ToPipe(' label gt="©2002 Michael Trebilcock"')
  332. Call ToPipe(' label gt=""')
  333. Call ToPipe('le')
  334. Call ToPipe('layout v b=2 cj weih=0')
  335. MG=ToPipe(' button ro b=0 gt "'Text'"')
  336. Call ToPipe('le')
  337. Call ToPipe('layout b=5')
  338. Call ToPipe(' layout v so weiw=0')
  339. Call ToPipe('  layout v b=0 weih=0')
  340. NG=ToPipe('   button gt="New Game"')
  341. SG=ToPipe('   button gt="Save Game"')
  342. Call ToPipe('   label gt=""')
  343. OG=ToPipe('   button gt="Oops"')
  344. HG=ToPipe('   button gt="Hold"')
  345. Call ToPipe('   label gt=""')
  346. Call ToPipe('   button gt="About"')
  347. QG=ToPipe('   button gt="Quit" c')
  348. Call ToPipe('  le')
  349. Call ToPipe('  layout v b=0')
  350. Call ToPipe('  le')
  351. Call ToPipe(' le')
  352. Call ToPipe(' layout v b=0 sw')
  353. Call ToPipe(' bitmap fn=RXDraughts.iff anim 0|0|0|0|0|0|0')
  354. Call Nums()
  355. DO i=1 TO 8
  356.  Call Buttons()
  357. End
  358. Call Nums()
  359. Call ToPipe(' le')
  360. Call ToPipe('le')
  361. Call ToPipe('open')
  362. Call Pieces()
  363. Return 0
  364.  
  365. GMove:
  366. IF Arg(1)="1" THEN DO
  367.  Move="";Done="";Sel="0"
  368.  Call ToPipe('con')
  369.  DO UNTIL Done="1"
  370.   Output=ReadLn(PIPE)
  371.   Parse Var Output W1" "W2" "W3
  372.   IF W1="close" THEN Call Break_C()
  373.   IF W2=NG THEN DO
  374.    Move="New Game"
  375.    End="1"
  376.   End
  377.   IF W2=HG THEN DO
  378.    IF Sel="0" THEN Sel="1"
  379.    ELSE Sel="0"
  380.    Call ToPipe('ID 'HG' selected='Sel)
  381.   End
  382.   IF W2=OG THEN Move=""
  383.   IF W2=SG THEN Move="Save Game"
  384.   IF W2>24 THEN DO
  385.    Call Grid2(GP.W2)
  386.    Move=Move""Let.Let""Num" "
  387.   End
  388.   Call ToPipe('ID 'MG' gt="'Strip(Move,," ")'"')
  389.   IF Words(Move)>1&Sel="0" THEN Done="1"
  390.   ELSE Call ToPipe('con')
  391.  End
  392.  IF Words(Move)<2 THEN Error="1"
  393. End
  394. ELSE DO
  395.  Call ToPipe('define bitmap anim 121'XY)
  396.  Call ToPipe('ID 'BP.Num3' ni=0')
  397.  IF Jump="1" THEN DO
  398.   Call ToPipe('define bitmap anim 121'XY)
  399.   Call ToPipe('ID 'BP.GNum2' ni=0')
  400.  End
  401.  PosX=P.Num4
  402.  PosX=PosX.PosX
  403.  Call ToPipe('define bitmap anim 'PosX''XY)
  404.  Call ToPipe('ID 'BP.Num4' ni=0')
  405.  Call ToPipe('ID 'MG' gt="'Move2'"')
  406. End
  407. Return 0
  408.  
  409. Buttons:
  410. IF Dis="" THEN DO
  411.  Dis=" ro";Dis2=""
  412.  Piece='anim 121'XY;Piece2='anim 151'XY
  413. End
  414. ELSE DO
  415.  Dis="";Dis2=" ro"
  416.  Piece='anim 151'XY;Piece2='anim 121'XY
  417. End
  418. Call ToPipe('  layout b=0 sw')
  419. Call ToPipe('   button minw=29 ro b=0 gt="'Let.i'"')
  420. GadNum=ToPipe('   button'Dis' b=0 'Piece2)
  421. Call ToPipe('   button'Dis2' b=0 'Piece)
  422. DO a=1 TO 3
  423.  Call ToPipe('   button'Dis' b=0 'Piece2)
  424.  Call ToPipe('   button'Dis2' b=0 'Piece)
  425. End
  426. Call ToPipe('   button minw=29 ro b=0 gt="'Let.i'"')
  427. Call ToPipe('  le')
  428. IF Dis=" ro" THEN GadNum=GadNum+1
  429. DO a=1 TO 4
  430.  GP.GadNum=Num
  431.  BP.Num=GadNum
  432.  Num=Num+1
  433.  GadNum=GadNum+2
  434. End
  435. Return 0
  436.  
  437. Nums:
  438. Call ToPipe('  layout b=0 sw')
  439. Call ToPipe('   button minw=29 ro b=0 gt=""')
  440. DO i=1 TO 8
  441.  Call ToPipe('   button minw=29 ro b=0 gt="'i'"')
  442. End
  443. Call ToPipe('   button minw=29 ro b=0 gt=""')
  444. Call ToPipe('  le')
  445. Return 0
  446.  
  447. Pieces:
  448. DO i=1 TO 32
  449.  PosX=P.i
  450.  PosX=PosX.PosX
  451.  Call ToPipe('define bitmap anim 'PosX''XY)
  452.  Call ToPipe('ID 'BP.i' ni=0')
  453. End
  454. Return 0
  455.  
  456. NewGame:
  457. IF ~Open(PIPE2,"AWNPipe:RXDraughts2/xc","RW") THEN DO
  458.  SAY "Unable to open GUI, please install AWNPipe:"
  459.  Exit
  460. End
  461.  
  462. TPipe="PIPE2"
  463.  
  464. Call ToPipe('title "New Game" v m defg')
  465. Call ToPipe('layout gt="Player options" so v')
  466. PG=ToPipe(' radiobutton rl="Two human players|Against the computer|Watch the computer|Online multiplayer"')
  467. Call ToPipe('le')
  468. Call ToPipe('space')
  469. Call ToPipe('layout gt="Load game" so')
  470. Call ToPipe(' layout v b=0')
  471. Call ToPipe('  label gt="Next player"')
  472. Call ToPipe('  space')
  473. PG2=ToPipe('  radiobutton rl="Black|Yellow"')
  474. Call ToPipe(' le')
  475. Call ToPipe(' space')
  476. Call ToPipe(' label gt="File: " ua')
  477. FG=ToPipe(' getfile chl')
  478. Call ToPipe('le')
  479. Call ToPipe('space')
  480. Call ToPipe('layout gt="Online options" so')
  481. Call ToPipe(' layout v b=0')
  482. Call ToPipe('  label gt="Player"')
  483. Call ToPipe('  space')
  484. PG3=ToPipe('  radiobutton rl="One|Two"')
  485. Call ToPipe(' le')
  486. Call ToPipe(' space')
  487. Call ToPipe(' label gt="IP: " ua')
  488. HG=ToPipe(' string lj chl')
  489. Call ToPipe('le')
  490. SG=ToPipe('button gt="Start"')
  491. Call ToPipe('open')
  492. Start="0";Opt="1"
  493. IP="";Play="B"
  494. TFile="";Plr=""
  495. DO UNTIL Start="1"
  496.  Call ToPipe('con')
  497.  Output=ReadLn(PIPE2)
  498.  Parse Var Output W1" "W2" "W3" 1 "W4
  499.  IF W1="close" THEN Call Break_C()
  500.  IF W2=PG THEN Opt=W3+1
  501.  IF W2=PG2 THEN DO
  502.   IF W3="0" THEN Play="B"
  503.   ELSE Play="W"
  504.  End
  505.  IF W2=FG THEN TFile=Strip(Left(W4,Length(W4)-1),,d2c(34))
  506.  IF W2=PG3 THEN Plr=W3+1
  507.  IF W2=HG THEN IP=W3
  508.  IF W2=SG THEN DO
  509.   IF Opt="4"&IP="" THEN Call rtezrequest("You must enter an IP address!")
  510.   ELSE Start="1"
  511.  End
  512. End
  513. IF Plr="" THEN Plr="1"
  514. IF Opt<4 THEN Plr=""
  515. Call Close(PIPE2)
  516. Return 0
  517.  
  518. ToPipe:
  519. Call WriteLn(TPipe,Arg(1))
  520. Output=ReadLn(TPipe)
  521. Parse Var Output W1" "Word2" "W3
  522. IF Word(Output,1)="close" THEN Call Break_C()
  523. Return Word2
  524.  
  525. FMove:
  526. SAY ""
  527. IF CJump="1" THEN DO
  528.  SAY "Checking for another jump with the same piece."
  529.  TheSqs=Num4
  530. End
  531. ELSE DO
  532.  IF Play="B" THEN Colour="black"
  533.  ELSE Colour="white"
  534.  SAY "Finding squares with "colour" pieces.."
  535.  TheSqs=""
  536.  DO i=1 TO 32
  537.   IF Play="B"&Upper(P.i)="B" THEN TheSqs=TheSqs""i" "
  538.   IF Play="W"&Upper(P.i)="W" THEN TheSqs=TheSqs""i" "
  539.  End
  540.  IF TheSqs="" THEN DO
  541.   SAY "No "colour" squares found.."
  542.   End="1"
  543.  End
  544.  ELSE DO
  545.   SAY "Squares with "colour" pieces are "TheSqs
  546.   SAY "Finding moveable pieces.."
  547.  End
  548. End
  549. Words=Words(TheSqs)
  550. ValidSqs="";ValidJps=""
  551. IF End~="1" THEN DO i=1 TO Words
  552.  TheSq=Word(TheSqs,i)
  553.  King="0"
  554.  IF Upper(P.TheSq)=P.TheSq THEN King="1"
  555.  Call Grid2(TheSq)
  556.  Call Grid(Let+1""Num-1);NextSq=GNum2
  557.  Call Grid(Let+1""Num+1);NextSq2=GNum2
  558.  Call Grid(Let+2""Num-2);NextSq3=GNum2
  559.  Call Grid(Let+2""Num+2);NextSq4=GNum2
  560.  Call Grid(Let-1""Num-1);NextSq5=GNum2
  561.  Call Grid(Let-1""Num+1);NextSq6=GNum2
  562.  Call Grid(Let-2""Num-2);NextSq7=GNum2
  563.  Call Grid(Let-2""Num+2);NextSq8=GNum2
  564.  TP.TheSq="";TJP.TheSq=""
  565.  IF Play="W" THEN DO
  566.   Play2="B"
  567.   Piece=King;Piece2="1"
  568.  End
  569.  ELSE DO
  570.   Play2="W"
  571.   Piece="1";Piece2=King
  572.  End
  573.  IF Upper(P.NextSq)=Play2&P.NextSq3=""&King=Piece THEN TJP.TheSq=TJP.TheSq""TheSq"/"NextSq"/"NextSq3" "
  574.  IF Upper(P.NextSq2)=Play2&P.NextSq4=""&King=Piece THEN TJP.TheSq=TJP.TheSq""TheSq"/"NextSq2"/"NextSq4" "
  575.  IF Upper(P.NextSq5)=Play2&P.NextSq7=""&King=Piece2 THEN TJP.TheSq=TJP.TheSq""TheSq"/"NextSq5"/"NextSq7" "
  576.  IF Upper(P.NextSq6)=Play2&P.NextSq8=""&King=Piece2 THEN TJP.TheSq=TJP.TheSq""TheSq"/"NextSq6"/"NextSq8" "
  577.  IF P.NextSq=""&King=Piece THEN TP.TheSq=TP.TheSq""NextSq" "
  578.  IF P.NextSq2=""&King=Piece THEN TP.TheSq=TP.TheSq""NextSq2" "
  579.  IF P.NextSq5=""&King=Piece2 THEN TP.TheSq=TP.TheSq""NextSq5" "
  580.  IF P.NextSq6=""&King=Piece2 THEN TP.TheSq=TP.TheSq""NextSq6" "
  581.  IF TP.TheSq~="" THEN ValidSqs=ValidSqs""TheSq" "
  582.  IF TJP.TheSq~="" THEN DO
  583.   Jump="1"
  584.   ValidJps=ValidJps""TheSq" "
  585.  End
  586. End
  587. IF CJump~="1"&End~="1" THEN DO
  588.  IF ValidSqs=""&ValidJps="" THEN DO
  589.   SAY "No moveable pieces found.."
  590.   End="1"
  591.  End
  592.  ELSE SAY "Moveable pieces are "ValidSqs""ValidJps
  593. End
  594. Return 0
  595.  
  596. Vacant:
  597. IF P.Num4~="" THEN DO
  598.  SAY "Invalid move. You must move to a vacant square."
  599.  Error="1"
  600. End
  601. Return 0
  602.  
  603. Grid:
  604. GLet=Left(Arg(1),1);GNum=SubStr(Arg(1),2,1)
  605. IF GLet<1|GLet>8|GNum<1|GNum>8 THEN GNum2="."
  606. ELSE DO
  607.  GNum2=GNum/2
  608.  IF Right(GNum2,2)=".5" THEN GNum2=GNum2+0.5
  609.  Parse Var GNum2 GNum2"."Decimal
  610.  GNum2=(GLet*4-4)+GNum2
  611. End
  612. Return 0
  613.  
  614. Grid2:
  615. Let=Arg(1)
  616. Let=Let/4+1
  617. Parse Var Let Let"."Decimal
  618. IF Decimal="25" THEN Num="1"
  619. IF Decimal="5" THEN Num="3"
  620. IF Decimal="75" THEN Num="5"
  621. IF Decimal="" THEN DO
  622.  Let=Let-1
  623.  Num="7"
  624. End
  625. IF Pos(".",Let/2)>0 THEN Num=Num+1
  626. Return 0
  627.  
  628. Halt:
  629. Break_C:
  630. IF Opt="4"&Plr="2" THEN DO
  631.  Call Open(TCP,"TCP:localhost/998","R")
  632.  Call Close(TCP)
  633. End
  634. IF Move="EOF" THEN SAY "Opponent has quit the game.."
  635. IF Plr="1"&Play="B"|Plr="2"&Play="W" THEN IF Open(TCP,"TCP:"IP"/998","W") THEN Call WriteLn(TCP,"EOF")
  636. SAY "***Break"
  637. Call Close(TPipe)
  638. Exit
  639.